package com.ai.plug.core.parser.tool.starter;

import com.ai.plug.core.parser.tool.des.AbstractDesParser;
import com.ai.plug.core.parser.tool.param.AbstractParamParser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.lang.reflect.Method;
import java.util.List;


/**
 * SS 早期解析器的使用，对收集到的参数进行拼装形成元数据（全链路解析）
 */
@Slf4j
@Deprecated
public class AddStarter extends AbstractStarter {


    /**
     * 工具描述解析  被指是通过反射拿到关于类及其方法的相关信息进行复用
     * @param parserList 解析器列表
     * @param method 工具的方法 用于提取工具方法名，方法参数及其类型，方法返回值等信息
     * @param toolClass 工具的类 用于获取工具类名 ,检查类上注解，获取类描述信息
     * @return
     */
    @Override
    public String runDesParse(List<AbstractDesParser> parserList, Method method, Class<?> toolClass) {
        StringBuilder result = new StringBuilder();
        //提取类中方法的信息获取name和描述
        parserList.forEach((parser) -> {
            //todo 责任链模式决定了如何处理多个解析器
            result.append(parser.doDesParse(method, toolClass));
        });
        // 如果解析结果为空，就调用默认的直接以方法名作为就可
        // 没解析的话，就执行默认操作
        if (!StringUtils.hasText(result.toString())) {
            log.warn("Please note that the parsing module you specified resulted in the {} tool not parsing the tool parameters", toolClass.getName() + "-" + method.getName());
            return AbstractDesParser.doDefaultParse(method, toolClass);
        }
        return result.toString();
    }

    /**
     * 参数必要性直接返回为空 工具名不需要这个
     * @param parserList 解析器列表
     * @param method 工具的方法
     * @param toolClass 工具的类
     * @param index 参数 索引
     * @return
     */
    @Override
    public Boolean runParamRequiredParse(List<AbstractParamParser> parserList, Method method, Class<?> toolClass, int index) {
        return null;
    }

    /**
     * 解析参数的描述，工具信息不需要这个
     * @param parserList 解析器列表
     * @param method 工具的方法
     * @param toolClass 工具的类
     * @param index 参数 索引
     * @return
     */
    @Override
    public String runParamDesParse(List<AbstractParamParser> parserList, Method method, Class<?> toolClass, int index) {
        return null;
    }


}



